
#include "asm-a64.h"

.global _start

.macro eret_set_el cur_level, entry_lable, lower_el
	ldr x0, =\entry_lable
	msr elr_el\cur_level, x0
	mov x0, \lower_el
	msr spsr_el\cur_level, x0
.endm

.macro eret_set_el3 entry_lable, lower_el
	eret_set_el 3, \entry_lable, \lower_el
.endm

.macro eret_set_el2 entry_lable, lower_el
	eret_set_el 2, \entry_lable, \lower_el
.endm

.macro eret_set_el1 entry_lable, lower_el
	eret_set_el 1, \entry_lable, \lower_el
.endm

_start:
	mov x0, #0x131 // a32, no-secure
	msr scr_el3, x0

	// 设置异常等级， b[3:2]=el, b[1]=res0, b[0]=1:sp_elx, b[0]=0:sp_el0
    // b[5:4] = 0x1 a32 stat
    ///////////////////////////////
    // aarch32 exception level
    // M[3:0] Mode
    // 0b0000 User
    // 0b0001 FIQ
    // 0b0010 IRQ
    // 0b0011 Supervisor
    // 0b0110 Monitor
    // 0b0111 Abort
    // 0b1010 Hyp
    // 0b1011 Undefined
    // 0b1111 System
    ///////////////////////////////
    // mov x0, #0x01d3  // a32-super SPSR_svc
    // mov x0, #0x01d0 // a32-user
    // mov x0, #0x01da // a32-hyp, 
    // mov x0, #0x01d6 // a32-mon
    // mov x0, #0x01df // a32-system
    // mov x0, #0x03c5 //el1h
    // mov x0, #0x03c9 // el2h
    // mov x0, 0x03cd // el3h
    // mov x0, 0x03cc // el3t
	// a32-svc
	// eret_set_el3 _a64_mix_a32_entry, #0x01d3
	// a32-hyp
	// eret_set_el3 _a64_mix_a32_entry, #0x01da
	// a32-sys
	// eret_set_el3 _a64_mix_a32_entry, #0x01df
    b el3_entry

el3_entry:
    mov x0, #0x8f000000
    mov sp, x0
    
    asm_print_u32 x0
    b el3_entry
    eret_set_el3 el2_entry, #0x03c9
    eret

el2_entry:
    b el3_entry

